From: Alexander Mikhaylenko Date: Mon, 8 Jul 2019 08:03:20 +0000 (+0500) Subject: workspaceThumbnail: Sync indicator with WorkspacesDisplay X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~781^2^2~258 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=9c1940ef9db5;p=gnome-shell.git workspaceThumbnail: Sync indicator with WorkspacesDisplay Now that both ThumbnailsBox and WorkspacesDisplay use single adjustments for controlling indicator and scrolling, create the adjustment in OverviewControls and pass it to both objects, effectively syncing indicator to scrolling. https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/821 --- diff --git a/js/ui/overviewControls.js b/js/ui/overviewControls.js index 687dc7888..2b5cf9db5 100644 --- a/js/ui/overviewControls.js +++ b/js/ui/overviewControls.js @@ -436,11 +436,28 @@ class ControlsManager extends St.Widget { this._dashSpacer = new DashSpacer(); this._dashSpacer.setDashActor(this._dashSlider); - this._thumbnailsBox = new WorkspaceThumbnail.ThumbnailsBox(); + let workspaceManager = global.workspace_manager; + let activeWorkspaceIndex = workspaceManager.get_active_workspace_index(); + + this._workspaceAdjustment = new St.Adjustment({ + value: activeWorkspaceIndex, + lower: 0, + page_increment: 1, + page_size: 1, + step_increment: 0, + upper: workspaceManager.n_workspaces, + }); + + this._nWorkspacesNotifyId = + workspaceManager.connect('notify::n-workspaces', + this._updateAdjustment.bind(this)); + + this._thumbnailsBox = + new WorkspaceThumbnail.ThumbnailsBox(this._workspaceAdjustment); this._thumbnailsSlider = new ThumbnailsSlider(this._thumbnailsBox); this.viewSelector = new ViewSelector.ViewSelector(searchEntry, - this.dash.showAppsButton); + this._workspaceAdjustment, this.dash.showAppsButton); this.viewSelector.connect('page-changed', this._setVisibility.bind(this)); this.viewSelector.connect('page-empty', this._onPageEmpty.bind(this)); @@ -457,6 +474,24 @@ class ControlsManager extends St.Widget { layout.connect('allocation-changed', this._updateWorkspacesGeometry.bind(this)); Main.overview.connect('showing', this._updateSpacerVisibility.bind(this)); + + this.connect('destroy', this._onDestroy.bind(this)); + } + + _onDestroy() { + global.workspace_manager.disconnect(this._nWorkspacesNotifyId); + } + + _updateAdjustment() { + let workspaceManager = global.workspace_manager; + let newNumWorkspaces = workspaceManager.n_workspaces; + let activeIndex = workspaceManager.get_active_workspace_index(); + + this._workspaceAdjustment.upper = newNumWorkspaces; + + // A workspace might have been inserted or removed before the active + // one, causing the adjustment to go out of sync, so update the value + this._workspaceAdjustment.value = activeIndex; } _updateWorkspacesGeometry() { diff --git a/js/ui/viewSelector.js b/js/ui/viewSelector.js index 3be94df24..8acea0c03 100644 --- a/js/ui/viewSelector.js +++ b/js/ui/viewSelector.js @@ -128,7 +128,7 @@ var ViewSelector = GObject.registerClass({ 'page-empty': {}, }, }, class ViewSelector extends Shell.Stack { - _init(searchEntry, showAppsButton) { + _init(searchEntry, workspaceAdjustment, showAppsButton) { super._init({ name: 'viewSelector', x_expand: true, @@ -171,7 +171,8 @@ var ViewSelector = GObject.registerClass({ this._iconClickedId = 0; this._capturedEventId = 0; - this._workspacesDisplay = new WorkspacesView.WorkspacesDisplay(); + this._workspacesDisplay = + new WorkspacesView.WorkspacesDisplay(workspaceAdjustment); this._workspacesPage = this._addPage(this._workspacesDisplay, _("Windows"), 'focus-windows-symbolic'); diff --git a/js/ui/workspaceThumbnail.js b/js/ui/workspaceThumbnail.js index 76f02c3c3..51f4275bd 100644 --- a/js/ui/workspaceThumbnail.js +++ b/js/ui/workspaceThumbnail.js @@ -7,7 +7,6 @@ const Background = imports.ui.background; const DND = imports.ui.dnd; const Main = imports.ui.main; const Workspace = imports.ui.workspace; -const WorkspacesView = imports.ui.workspacesView; // The maximum size of a thumbnail is 1/10 the width and height of the screen let MAX_THUMBNAIL_SCALE = 1 / 10.; @@ -628,7 +627,7 @@ var ThumbnailsBox = GObject.registerClass({ 0, Infinity, 0), }, }, class ThumbnailsBox extends St.Widget { - _init() { + _init(scrollAdjustment) { super._init({ reactive: true, style_class: 'workspace-thumbnails', request_mode: Clutter.RequestMode.WIDTH_FOR_HEIGHT }); @@ -701,18 +700,17 @@ var ThumbnailsBox = GObject.registerClass({ this._syncStackingId = 0; this._workareasChangedId = 0; - let workspaceManager = global.workspace_manager; - let activeWorkspaceIndex = workspaceManager.get_active_workspace_index(); - this._scrollAdjustment = new St.Adjustment({ - value: activeWorkspaceIndex, - lower: 0, - page_increment: 1, - page_size: 1, - step_increment: 0, - upper: workspaceManager.n_workspaces, - }); + this._scrollAdjustment = scrollAdjustment; + + this._scrollAdjustment.connect('notify::value', adj => { + let workspaceManager = global.workspace_manager; + let activeIndex = workspaceManager.get_active_workspace_index(); + + this._animatingIndicator = adj.value !== activeIndex; + + if (!this._animatingIndicator) + this._queueUpdateStates(); - this._scrollAdjustment.connect('notify::value', () => { this.queue_relayout(); }); } @@ -915,9 +913,6 @@ var ThumbnailsBox = GObject.registerClass({ _createThumbnails() { let workspaceManager = global.workspace_manager; - this._switchWorkspaceNotifyId = - global.window_manager.connect('switch-workspace', - this._activeWorkspaceChanged.bind(this)); this._nWorkspacesNotifyId = workspaceManager.connect('notify::n-workspaces', this._workspacesChanged.bind(this)); @@ -950,10 +945,6 @@ var ThumbnailsBox = GObject.registerClass({ if (this._thumbnails.length == 0) return; - if (this._switchWorkspaceNotifyId > 0) { - global.window_manager.disconnect(this._switchWorkspaceNotifyId); - this._switchWorkspaceNotifyId = 0; - } if (this._nWorkspacesNotifyId > 0) { let workspaceManager = global.workspace_manager; workspaceManager.disconnect(this._nWorkspacesNotifyId); @@ -982,8 +973,6 @@ var ThumbnailsBox = GObject.registerClass({ let oldNumWorkspaces = validThumbnails.length; let newNumWorkspaces = workspaceManager.n_workspaces; - this._scrollAdjustment.upper = newNumWorkspaces; - if (newNumWorkspaces > oldNumWorkspaces) { this.addThumbnails(oldNumWorkspaces, newNumWorkspaces - oldNumWorkspaces); } else { @@ -1368,17 +1357,4 @@ var ThumbnailsBox = GObject.registerClass({ childBox.y2 = indicatorY2 + indicatorBottomFullBorder; this._indicator.allocate(childBox, flags); } - - _activeWorkspaceChanged(_wm, from, to, _direction) { - this._scrollAdjustment.value = from; - this._animatingIndicator = true; - this._scrollAdjustment.ease(to, { - progress_mode: Clutter.AnimationMode.EASE_OUT_QUAD, - duration: WorkspacesView.WORKSPACE_SWITCH_TIME, - onComplete: () => { - this._animatingIndicator = false; - this._queueUpdateStates(); - }, - }); - } }); diff --git a/js/ui/workspacesView.js b/js/ui/workspacesView.js index 8c06e5441..8660cacdd 100644 --- a/js/ui/workspacesView.js +++ b/js/ui/workspacesView.js @@ -410,23 +410,12 @@ class ExtraWorkspaceView extends WorkspacesViewBase { var WorkspacesDisplay = GObject.registerClass( class WorkspacesDisplay extends St.Widget { - _init() { + _init(scrollAdjustment) { super._init({ clip_to_allocation: true }); this.connect('notify::allocation', this._updateWorkspacesActualGeometry.bind(this)); let workspaceManager = global.workspace_manager; - let activeWorkspaceIndex = workspaceManager.get_active_workspace_index(); - this._scrollAdjustment = new St.Adjustment({ - value: activeWorkspaceIndex, - lower: 0, - page_increment: 1, - page_size: 1, - step_increment: 0, - upper: workspaceManager.n_workspaces, - }); - - workspaceManager.bind_property('n-workspaces', - this._scrollAdjustment, 'upper', GObject.BindingFlags.SYNC_CREATE); + this._scrollAdjustment = scrollAdjustment; this._switchWorkspaceId = global.window_manager.connect('switch-workspace',